﻿using System;
using System.Collections.Generic;

namespace Ukagaka.Named.Ghost.Shiori
{
	/// <summary>
	/// ヘッダ群を表現します
	/// </summary>
	public class HeaderList : List<Header>
	{
		/// <summary>
		/// ヘッダの名前からヘッダの値を取得します
		/// </summary>
		/// <param name="name">ヘッダの名前</param>
		/// <returns>ヘッダの値</returns>
		/// <exception cref="KeyNotFoundException">指定されたヘッダは存在しません</exception>
		public string this[ string name ]
		{
			get
			{
				var header = GetHeader( name );

				if ( null == header )
				{
					throw new KeyNotFoundException( "指定されたヘッダは存在しません" );
				}
				else
				{
					return header.Value;
				}
			}
			set
			{
				var header = GetHeader( name );

				if ( null == header )
				{
					Add( new Header( name, value ) );
				}
				else
				{
					header.Value = value;
				}
			}
		}

		/// <summary>
		/// ヘッダ群を初期化します
		/// </summary>
		public HeaderList( )
		{
			// nothing
		}

		/// <summary>
		/// ヘッダの名前からヘッダを取得します
		/// </summary>
		/// <param name="name">ヘッダの名前</param>
		/// <returns>ヘッダ</returns>
		public Header GetHeader( string name )
		{
			return Find( value => name.Equals( value.Name, StringComparison.InvariantCultureIgnoreCase ) );
		}

		/// <summary>
		/// ヘッダ群を取得します
		/// </summary>
		/// <returns>ヘッダ群</returns>
		public override string ToString( )
		{
			var str = string.Join( "\r\n", this );

			if ( 0 < str.Length )
			{
				return string.Concat( str, "\r\n" );
			}
			else
			{
				return str;
			}
		}
	}
}
